package com.zeny.express.framework.log.log4j;

import org.apache.log4j.AsyncAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 * Asynchronous Logger Factory
 * 
 * @author zhuwei
 * @date 2013年10月12日 上午11:36:01
 */
public class AsyncLoggerFactory {

	/**
	 * 工厂
	 */
	private static AsyncLoggerFactory factory = null;

	/**
	 * 工厂方法
	 * 
	 * @author zhuwei
	 * @date 2013年10月12日 上午11:36:30
	 * @param dbLogAppender
	 * @return
	 */
	public static synchronized AsyncLoggerFactory instance(
			DBLogAppender dbLogAppender) {
		if (factory == null) {
			factory = new AsyncLoggerFactory(dbLogAppender);
		}
		return factory;
	}

	/**
	 * 异步Logger，
	 */
	private Logger asyncLogger;

	/**
	 * Constructor
	 * 
	 * @author zhuwei
	 * @date 2013年10月12日 上午11:38:10
	 */
	private AsyncLoggerFactory(DBLogAppender dbLogAppender) {
		// 设置异步
		AsyncAppender appender = new AsyncAppender();
		// 缓存大小，超过buffer则忽略
		appender.setBufferSize(4096);
		appender.addAppender(dbLogAppender);
		appender.setThreshold(Level.ALL);
		asyncLogger = Logger.getLogger(this.getClass());
		asyncLogger.setLevel(Level.ALL);
		asyncLogger.setAdditivity(false);
		asyncLogger.removeAllAppenders();
		asyncLogger.addAppender(appender);
	}

	/**
	 * Asynchronously log to db
	 * 
	 * @author zhuwei
	 * @date 2013年10月12日 上午11:39:56
	 * @param entity
	 */
	public void asyncLogDB(Object entity) {
		asyncLogger.trace(entity);
	}

}
